#!/bin/sh
MOD_NAME=backup_apn
MOD_SETTINGS="/opt/$MOD_NAME/etc/settings"
MOD_VAR_DIR="/var/$MOD_NAME"
MOD_BACKUP_APN_STATUS=$MOD_VAR_DIR/status
PPP_SETTINGS="/etc/settings.ppp"

. $MOD_SETTINGS
. $PPP_SETTINGS

TIMEOUT=$MOD_BACKUP_APN_TIMEOUT
TIMEOUT_SEC=$((60*MOD_BACKUP_APN_TIMEOUT_SEC))

update_apn()
{
  SIM=$1
  APN=$2
  USERNAME=$3
  PASSWORD=$4

  if [ "$SIM" = "1" ]; then
     sed -i -r "s/PPP_APN=.*/PPP_APN=$APN/" $PPP_SETTINGS
     sed -i -r "s/PPP_USERNAME=.*/PPP_USERNAME=$USERNAME/" $PPP_SETTINGS
     sed -i -r "s/PPP_PASSWORD=.*/PPP_PASSWORD=$PASSWORD/" $PPP_SETTINGS
     sed -i -r "s/PPP_DEFAULT_SIM=.*/PPP_DEFAULT_SIM=1/" $PPP_SETTINGS
  else
     sed -i -r "s/PPP_APN2=.*/PPP_APN2=$APN/" $PPP_SETTINGS
     sed -i -r "s/PPP_USERNAME2=.*/PPP_USERNAME2=$USERNAME/" $PPP_SETTINGS
     sed -i -r "s/PPP_PASSWORD2=.*/PPP_PASSWORD2=$PASSWORD/" $PPP_SETTINGS
     sed -i -r "s/PPP_DEFAULT_SIM=.*/PPP_DEFAULT_SIM=2/" $PPP_SETTINGS
  fi
  /etc/init.d/ppp restart

  return 0
}

DATE=`date +'%Y-%m-%d %H:%M:%S'`
echo "$DATE Backup APN service is running." > $MOD_BACKUP_APN_STATUS
if [ "$PPP_SIM_ENABLED" = "1" ]; then
  echo "$DATE SIM 1 is enabled." >> $MOD_BACKUP_APN_STATUS
else
   echo "$DATE SIM 1 is disabled." >> $MOD_BACKUP_APN_STATUS
fi
if [ "$PPP_SIM_ENABLED2" = "1" ]; then
  echo "$DATE SIM 2 is enabled." >> $MOD_BACKUP_APN_STATUS
else
   echo "$DATE SIM 2 is disabled." >> $MOD_BACKUP_APN_STATUS
fi
if [ "$PPP_SW_FAILURE" = "1" ]; then
  echo "$DATE Switch to other SIM card when connection fails is enabled." >> $MOD_BACKUP_APN_STATUS
else
   echo "$DATE Switch to other SIM card when connection fails is disabled." >> $MOD_BACKUP_APN_STATUS
fi
echo "$DATE SIM $PPP_DEFAULT_SIM is set as default." >> $MOD_BACKUP_APN_STATUS

APN1_1=$MOD_BACKUP_APN_SIM1_APN_PRI
USERNAME1_1=$MOD_BACKUP_APN_SIM1_USERNAME_PRI
PASSWORD1_1=$MOD_BACKUP_APN_SIM1_PASSWORD_PRI
APN2_1=$MOD_BACKUP_APN_SIM1_APN_SEC
USERNAME2_1=$MOD_BACKUP_APN_SIM1_USERNAME_SEC
PASSWORD2_1=$MOD_BACKUP_APN_SIM1_PASSWORD_SEC
APN1_2=$MOD_BACKUP_APN_SIM2_APN_PRI
USERNAME1_2=$MOD_BACKUP_APN_SIM2_USERNAME_PRI
PASSWORD1_2=$MOD_BACKUP_APN_SIM2_PASSWORD_PRI
APN2_2=$MOD_BACKUP_APN_SIM2_APN_SEC
USERNAME2_2=$MOD_BACKUP_APN_SIM2_USERNAME_SEC
PASSWORD2_2=$MOD_BACKUP_APN_SIM2_PASSWORD_SEC

status mwan | grep -q "1st"
if [ "$?" = "0" ]; then
  SIM=1

  APN=$APN1_1
  USERNAME=$USERNAME1_1
  PASSWORD=$PASSWORD1_1
else
  SIM=2
  APN=$APN1_2
  USERNAME=$USERNAME1_2
  PASSWORD=$PASSWORD1_2
fi
update_apn $SIM $APN $USERNAME $PASSWORD
echo "$DATE Changed APN to $APN (SIM $SIM)" >> $MOD_BACKUP_APN_STATUS

while [ 1 ]; do
    DATE=`date +'%Y-%m-%d %H:%M:%S'`
    status mwan | grep -r "Uptime"
    if [ "$?" = "1" ] || [ "$TIMEOUT" = "0" ]; then
        [ "$TIMEOUT" != "0" ] && TIMEOUT=$((TIMEOUT-1))
        SIM_CHANGED=0
        status mwan | grep -q "1st"
        if [ "$?" = "0" ]; then
          if [ "$SIM" != "1" ]; then
            echo "$DATE SIM chnaged to SIM 1." >> $MOD_BACKUP_APN_STATUS
            SIM_CHANGED=1
          fi
        else
          if [ "$SIM" != "2" ]; then
            echo "$DATE SIM chnaged to SIM 2." >> $MOD_BACKUP_APN_STATUS
            SIM_CHANGED=1
          fi
        fi
        if [ "$TIMEOUT" = "0" ] || [ "$SIM_CHANGED" = "1" ]; then
          TIMEOUT=$MOD_BACKUP_APN_TIMEOUT
          TIMEOUT_SEC=$((60*MOD_BACKUP_APN_TIMEOUT_SEC))
          echo "$DATE APN $APN timed out (SIM $SIM)." >> $MOD_BACKUP_APN_STATUS
          status mwan | grep -q "1st"
          if [ "$?" = "0" ]; then
            if [ "$SIM" != "1" ]; then
              APN=$APN1_1
              USERNAME=$USERNAME1_1
              PASSWORD=$PASSWORD1_1
              SIM=1
            else
              if [ "$APN" = "$APN2_1" ]; then
                APN=$APN1_1
                USERNAME=$USERNAME1_1
                PASSWORD=$PASSWORD1_1
              else
                APN=$APN2_1
                USERNAME=$USERNAME2_1
                PASSWORD=$PASSWORD2_1
              fi
            fi
          else
            if [ "$SIM" != "2" ]; then
              APN=$APN1_2
              USERNAME=$USERNAME1_2
              PASSWORD=$PASSWORD1_2
              SIM=2
            else
              if [ "$APN" = "$APN2_2" ]; then
                APN=$APN1_2
                USERNAME=$USERNAME1_2
                PASSWORD=$PASSWORD1_2
              else
                APN=$APN2_2
                USERNAME=$USERNAME2_2
                PASSWORD=$PASSWORD2_2
              fi
            fi
          fi
          update_apn $SIM $APN $USERNAME $PASSWORD
          TIMEOUT=$MOD_BACKUP_APN_TIMEOUT
          echo "$DATE Changed APN to $APN (SIM $SIM)." >> $MOD_BACKUP_APN_STATUS
        fi
        sleep 1
    else
      TIMEOUT=$MOD_BACKUP_APN_TIMEOUT
      status mwan | grep -q "1st"
      if [ "$?" = "0" ]; then
        if [ "$SIM" != "1" ]; then
          echo "$DATE SIM changed to SIM 1." >> $MOD_BACKUP_APN_STATUS
          TIMEOUT=0
        fi
        if [ "$APN" != "$APN1_1" ]; then
          TIMEOUT_SEC=$((TIMEOUT_SEC-5))
           if [ "$TIMEOUT_SEC" = "0" ]; then
             TIMEOUT=0
             echo "$DATE Changed APN to primary APN (SIM 1)." >> $MOD_BACKUP_APN_STATUS
           fi
        fi
      else
        if [ "$SIM" != "2" ]; then
          echo "$DATE SIM changed to SIM 2." >> $MOD_BACKUP_APN_STATUS
          TIMEOUT=0
        fi
        if [ "$APN" != "$APN1_2" ]; then
          TIMEOUT_SEC=$((TIMEOUT_SEC-5))
           if [ "$TIMEOUT_SEC" = "0" ]; then
             TIMEOUT=0
             echo "$DATE Changed APN to primary APN (SIM 2)." >> $MOD_BACKUP_APN_STATUS
           fi
        fi
      fi
      sleep 5
    fi
done

exit 0
